package com.wp;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public  class BaseClass {
    public static void main(String[] args) {
        Class clz = Person.class;
        String fullName = clz.getName();
        String simpleName = clz.getSimpleName();
        System.out.println("以下是"+fullName+"类的基本信息"+simpleName);
        System.out.println("--------------------------------------");

        // 获取Person类所在的所有包
        Package pkg = clz.getPackage();
        System.out.println(simpleName+"定义在"+pkg.getName()+"包中");
        System.out.println("--------------------------------------");

        // 获得clz所表示的实体(类、接口、基本类型或void)的超类的Class
        // 如果clz表示Object类、一个接口、一个基本类型或void，则返回 null
        // 如果clz表示一个数组类，则返回表示Object类的Class实例
        Class superClass = clz.getSuperclass();
        System.out.println(simpleName+"类的超级类是"+superClass.getName());
        System.out.println("--------------------------------------");

        Class [] interfaces = clz.getInterfaces();
        System.out.println(simpleName+"类所在的接口:");
        for (Class c:interfaces){
            System.out.println("\t"+c.getName());
        }
//        int modifier = clz.getModifiers();

        Constructor [] cons = Person.class.getDeclaredConstructors();

        // 构造方法的一些信息
        System.out.println("=========构造方法展示=========");
        for (Constructor con:cons){
            System.out.println("访问修饰符:");
            int modifier = con.getModifiers();
            if ((modifier & Modifier.PUBLIC)==Modifier.PUBLIC){
                System.out.println("public");
            }else if ((modifier & Modifier.PROTECTED)==Modifier.PROTECTED){
                System.out.println("protected");
            }else if ((modifier & Modifier.PRIVATE)==Modifier.PRIVATE){
                System.out.println("private");
            }else {
                System.out.println("default(package)");
            }
            // 获取构造方法的参数列表
            Class [] params = con.getParameterTypes();
            if (params.length == 0){
                System.out.println("该构造方法没有参数");
            }else{
                System.out.print("该参数的构造方法为: [");
                for (int i =0;i<params.length;i++){
                    if (i!=0)
                        System.out.println(", ");
                    System.out.print(params[i].getName());
                }
                System.out.println("]");
            }
        }
        Field [] fields = Person.class.getDeclaredFields();
        // 展示属性信息
        System.out.println("=============属性展示============");
        for (Field field : fields){
            System.out.println("属性名"+field.getName());
            System.out.println("类型："+field.getType().getName());

            System.out.println("访问修饰符：");
            int modifier = field.getModifiers();
            if ((modifier & Modifier.STATIC)==Modifier.STATIC){
                System.out.println("static");
            }if ((modifier & Modifier.FINAL)==Modifier.FINAL){
                System.out.println("final");
                System.out.println("-----------------");
            }
        }

        Method [] methods = Person.class.getMethods();

        // 展示方法的一些信息
        System.out.println("=================方法展示================");
        for (Method method : methods){
            System.out.println("方法名："+method.getName());
            System.out.println("方法类型："+method.getReturnType());

            System.out.println("main public static void String(System.in)");


//            // e
//            Class [] params = method.getExceptionTypes();

        }
    }
}
